const jwt = require('jsonwebtoken');
require('dotenv').config();
const { client: redisClient } = require('../config/redis.config');
const { UnauthorizedError } = require('../utils/CustomError');
const SECRET = process.env.JWT_SECRET || 'your_secret_key';

/**
 * 验证请求头中的 Token 并检查黑名单
 */
async function authenticateToken(req, res, next) {
    // 改为 async 函数
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];

    if (!token) {
        return next(new UnauthorizedError('访问受限，缺少Token')); // 使用 CustomError
    }

    // --- 1. 检查黑名单 ---
    const isBlacklisted = await redisClient.get(BLACKLIST_PREFIX + token);
    if (isBlacklisted) {
        return next(new UnauthorizedError('Token 已被注销，请重新登录'));
    }

    // --- 2. 验证 JWT 有效性 ---
    jwt.verify(token, SECRET, (err, user) => {
        if (err) {
            // JWT 库抛出的过期或签名无效错误会被 errorHandler 处理
            return next(err);
        }
        req.user = user;
        next();
    });
}

/**
 * 将 Token 加入黑名单 (用于用户注销)
 * @param {string} token - 要注销的 JWT
 * @param {number} expirySeconds - Token 的剩余有效期 (秒)
 */
async function blacklistToken(token, expirySeconds) {
    if (!token || expirySeconds <= 0) return;

    await redisClient.set(BLACKLIST_PREFIX + token, '1', {
        EX: expirySeconds, // Token 将在过期时间到达后自动从 Redis 移除
    });
}

module.exports = { authenticateToken };
